﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
namespace Lion.WeiXin.Core.Data
{
   public class SqlHelper
    {
       static string strConn = ConfigurationManager.ConnectionStrings["HappyTimeDB"].ConnectionString;

       public static SqlConnection CreateConn()
       {
           return new SqlConnection(strConn);
       }

       public static int ExecuteSql(string sql,List<SqlParameter> parameters)
       {
           SqlConnection conn = null;
           int rows = 0;
           try
           {
               conn = new SqlConnection(strConn);
               conn.Open();
               SqlCommand cmd = new SqlCommand(sql,conn);
               cmd.CommandText = sql;
               cmd.CommandType = CommandType.Text;
               foreach (SqlParameter item in parameters)
               {
                   cmd.Parameters.Add(item);
               }

              rows=  cmd.ExecuteNonQuery();
               cmd.Dispose();             

           }
           catch (Exception ex)
           {
               throw ex;
           }
           finally
           {
               conn.Close();
           }
           return rows;
          
       }

       /// <summary>
       /// 获取最大的ID号
       /// </summary>
       /// <param name="FieldName">要取ID的字段名</param>
       /// <param name="TableName">表名</param>
       /// <returns></returns>
       public static int GetMaxID(string FieldName, string TableName)
       {
           string strsql = "select max(" + FieldName + ")+1 from " + TableName;
           object obj = GetSingle(strsql);
           if (obj == null)
           {
               return 1;
           }
           else
           {
               return int.Parse(obj.ToString());
           }
       }
       public static bool Exists(string strSql)
       {
           object obj = GetSingle(strSql);
           int cmdresult;
           if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
           {
               cmdresult = 0;
           }
           else
           {
               cmdresult = int.Parse(obj.ToString());
           }
           if (cmdresult == 0)
           {
               return false;
           }
           else
           {
               return true;
           }
       }
       /// <summary>
       /// 表是否存在
       /// </summary>
       /// <param name="TableName"></param>
       /// <returns></returns>
       public static bool TabExists(string TableName)
       {
           string strsql = "select count(*) from sysobjects where id = object_id(N'[" + TableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
           //string strsql = "SELECT count(*) FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + TableName + "]') AND type in (N'U')";
           object obj = GetSingle(strsql);
           int cmdresult;
           if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
           {
               cmdresult = 0;
           }
           else
           {
               cmdresult = int.Parse(obj.ToString());
           }
           if (cmdresult == 0)
           {
               return false;
           }
           else
           {
               return true;
           }
       }
       public static bool Exists(string strSql, params SqlParameter[] cmdParms)
       {
           object obj = GetSingle(strSql, cmdParms);
           int cmdresult;
           if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
           {
               cmdresult = 0;
           }
           else
           {
               cmdresult = int.Parse(obj.ToString());
           }
           if (cmdresult == 0)
           {
               return false;
           }
           else
           {
               return true;
           }
       }
      

       #region  执行简单SQL语句

       /// <summary>
       /// 执行SQL语句，返回影响的记录数
       /// </summary>
       /// <param name="sql">SQL语句</param>
       /// <returns>影响的记录数</returns>
       public static int ExecuteSql(string sql)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand(sql, connection))
               {
                   try
                   {
                       connection.Open();
                       int rows = cmd.ExecuteNonQuery();
                       return rows;
                   }
                   catch (System.Data.SqlClient.SqlException E)
                   {
                       connection.Close();
                       throw new Exception(E.Message);
                   }
               }
           }
       }

       public static int ExecuteSqlByTime(string SQLString, int Times)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand(SQLString, connection))
               {
                   try
                   {
                       connection.Open();
                       cmd.CommandTimeout = Times;
                       int rows = cmd.ExecuteNonQuery();
                       return rows;
                   }
                   catch (System.Data.SqlClient.SqlException E)
                   {
                       connection.Close();
                       throw new Exception(E.Message);
                   }
               }
           }
       }

       /// <summary>
       /// 执行多条SQL语句，实现数据库事务。
       /// </summary>
       /// <param name="sqlList">多条SQL语句</param>		
       public static void ExecuteSqlTran(List<string> sqlList)
       {
           using (SqlConnection conn = new SqlConnection(strConn))
           {
               conn.Open();
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = conn;
               SqlTransaction tx = conn.BeginTransaction();
               cmd.Transaction = tx;
               try
               {
                   foreach (string strsql in sqlList)
                   {  
                       if (strsql.Trim().Length > 1)
                       {
                           cmd.CommandText = strsql;
                           cmd.ExecuteNonQuery();
                       }
                   }
                   tx.Commit();
               }
               catch (System.Data.SqlClient.SqlException E)
               {
                   tx.Rollback();
                   throw new Exception(E.Message);
               }
           }
       }
       
       /// <summary>
       /// 执行带一个存储过程参数的的SQL语句。
       /// </summary>
       /// <param name="SQLString">SQL语句</param>
       /// <param name="content">参数内容,比如一个字段是格式复杂的文章，有特殊符号，可以通过这个方式添加</param>
       /// <returns>影响的记录数</returns>
       public static int ExecuteSql(string SQLString, string content)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               SqlCommand cmd = new SqlCommand(SQLString, connection);
               System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
               myParameter.Value = content;
               cmd.Parameters.Add(myParameter);
               try
               {
                   connection.Open();
                   int rows = cmd.ExecuteNonQuery();
                   return rows;
               }
               catch (System.Data.SqlClient.SqlException E)
               {
                   throw new Exception(E.Message);
               }
               finally
               {
                   cmd.Dispose();
                   connection.Close();
               }
           }
       }
       /// <summary>
       /// 执行带一个存储过程参数的的SQL语句。
       /// </summary>
       /// <param name="SQLString">SQL语句</param>
       /// <param name="content">参数内容,比如一个字段是格式复杂的文章，有特殊符号，可以通过这个方式添加</param>
       /// <returns>影响的记录数</returns>
       public static object ExecuteSqlGet(string SQLString, string content)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               SqlCommand cmd = new SqlCommand(SQLString, connection);
               System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
               myParameter.Value = content;
               cmd.Parameters.Add(myParameter);
               try
               {
                   connection.Open();
                   object obj = cmd.ExecuteScalar();
                   if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                   {
                       return null;
                   }
                   else
                   {
                       return obj;
                   }
               }
               catch (System.Data.SqlClient.SqlException E)
               {
                   throw new Exception(E.Message);
               }
               finally
               {
                   cmd.Dispose();
                   connection.Close();
               }
           }
       }
       /// <summary>
       /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
       /// </summary>
       /// <param name="strSQL">SQL语句</param>
       /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
       /// <returns>影响的记录数</returns>
       public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               SqlCommand cmd = new SqlCommand(strSQL, connection);
               System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs", SqlDbType.Image);
               myParameter.Value = fs;
               cmd.Parameters.Add(myParameter);
               try
               {
                   connection.Open();
                   int rows = cmd.ExecuteNonQuery();
                   return rows;
               }
               catch (System.Data.SqlClient.SqlException E)
               {
                   throw new Exception(E.Message);
               }
               finally
               {
                   cmd.Dispose();
                   connection.Close();
               }
           }
       }

       /// <summary>
       /// 执行一条计算查询结果语句，返回查询结果（object）。
       /// </summary>
       /// <param name="SQLString">计算查询结果语句</param>
       /// <returns>查询结果（object）</returns>
       public static object GetSingle(string SQLString)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand(SQLString, connection))
               {
                   try
                   {
                       connection.Open();
                       object obj = cmd.ExecuteScalar();
                       if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                       {
                           return null;
                       }
                       else
                       {
                           return obj;
                       }
                   }
                   catch (System.Data.SqlClient.SqlException e)
                   {
                       connection.Close();
                       throw new Exception(e.Message);
                   }
               }
           }
       }
       public static object GetSingle(string SQLString, int Times)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand(SQLString, connection))
               {
                   try
                   {
                       connection.Open();
                       cmd.CommandTimeout = Times;
                       object obj = cmd.ExecuteScalar();
                       if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                       {
                           return null;
                       }
                       else
                       {
                           return obj;
                       }
                   }
                   catch (System.Data.SqlClient.SqlException e)
                   {
                       connection.Close();
                       throw new Exception(e.Message);
                   }
               }
           }
       }
       /// <summary>
       /// 执行查询语句，返回SqlDataReader ( 注意：使用后一定要对SqlDataReader进行Close )
       /// </summary>
       /// <param name="strSQL">查询语句</param>
       /// <returns>SqlDataReader</returns>
       public static SqlDataReader ExecuteReader(string strSQL)
       {
           SqlConnection connection = null;
           SqlCommand cmd = null;
           try
           {
               connection = new SqlConnection(strConn);
               cmd = new SqlCommand(strSQL, connection);
               connection.Open();
               SqlDataReader myReader = cmd.ExecuteReader();
               return myReader;
           }
           catch (System.Data.SqlClient.SqlException e)
           {
               throw new Exception(e.Message);
           }
           finally
           {
               cmd.Dispose();
               connection.Close();
           }	

       }
       /// <summary>
       /// 执行查询语句，返回DataSet
       /// </summary>
       /// <param name="SQLString">查询语句</param>
       /// <returns>DataSet</returns>
       public static DataSet Query(string SQLString)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               DataSet ds = new DataSet();
               try
               {
                   connection.Open();
                   SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                   command.Fill(ds, "ds");
               }
               catch (System.Data.SqlClient.SqlException ex)
               {
                   throw new Exception(ex.Message);
               }
               return ds;
           }
       }
       public static DataSet Query(string SQLString, int Times)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               DataSet ds = new DataSet();
               try
               {
                   connection.Open();
                   SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                   command.SelectCommand.CommandTimeout = Times;
                   command.Fill(ds, "ds");
               }
               catch (System.Data.SqlClient.SqlException ex)
               {
                   throw new Exception(ex.Message);
               }
               return ds;
           }
       }



       #endregion

       #region 执行带参数的SQL语句

       /// <summary>
       /// 执行SQL语句，返回影响的记录数
       /// </summary>
       /// <param name="SQLString">SQL语句</param>
       /// <returns>影响的记录数</returns>
       public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand())
               {
                   try
                   {
                       PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                       int rows = cmd.ExecuteNonQuery();
                       cmd.Parameters.Clear();
                       return rows;
                   }
                   catch (System.Data.SqlClient.SqlException E)
                   {
                       throw new Exception(E.Message);
                   }
               }
           }
       }


      
       /// <summary>
       /// 执行一条计算查询结果语句，返回查询结果（object）。
       /// </summary>
       /// <param name="SQLString">计算查询结果语句</param>
       /// <returns>查询结果（object）</returns>
       public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               using (SqlCommand cmd = new SqlCommand())
               {
                   try
                   {
                       PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                       object obj = cmd.ExecuteScalar();
                       cmd.Parameters.Clear();
                       if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                       {
                           return null;
                       }
                       else
                       {
                           return obj;
                       }
                   }
                   catch (System.Data.SqlClient.SqlException e)
                   {
                       throw new Exception(e.Message);
                   }
               }
           }
       }

       /// <summary>
       /// 执行查询语句，返回SqlDataReader ( 注意：使用后一定要对SqlDataReader进行Close )
       /// </summary>
       /// <param name="strSQL">查询语句</param>
       /// <returns>SqlDataReader</returns>
       public static SqlDataReader ExecuteReader(string SQLString, params SqlParameter[] cmdParms)
       {
           SqlConnection connection = new SqlConnection(strConn);
           SqlCommand cmd = new SqlCommand();
           try
           {
               PrepareCommand(cmd, connection, null, SQLString, cmdParms);
               SqlDataReader myReader = cmd.ExecuteReader();
               cmd.Parameters.Clear();
               return myReader;
           }
           catch (System.Data.SqlClient.SqlException e)
           {
               throw new Exception(e.Message);
           }
           //			finally
           //			{
           //				cmd.Dispose();
           //				connection.Close();
           //			}	

       }

       /// <summary>
       /// 执行查询语句，返回DataSet
       /// </summary>
       /// <param name="SQLString">查询语句</param>
       /// <returns>DataSet</returns>
       public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               SqlCommand cmd = new SqlCommand();
               PrepareCommand(cmd, connection, null, SQLString, cmdParms);
               using (SqlDataAdapter da = new SqlDataAdapter(cmd))
               {
                   DataSet ds = new DataSet();
                   try
                   {
                       da.Fill(ds, "ds");
                       cmd.Parameters.Clear();
                   }
                   catch (System.Data.SqlClient.SqlException ex)
                   {
                       throw new Exception(ex.Message);
                   }
                   return ds;
               }
           }
       }


       private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
       {
           if (conn.State != ConnectionState.Open)
               conn.Open();
           cmd.Connection = conn;
           cmd.CommandText = cmdText;
           if (trans != null)
               cmd.Transaction = trans;
           cmd.CommandType = CommandType.Text;//cmdType;
           if (cmdParms != null)
           {


               foreach (SqlParameter parameter in cmdParms)
               {
                   if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                       (parameter.Value == null))
                   {
                       parameter.Value = DBNull.Value;
                   }
                   cmd.Parameters.Add(parameter);
               }
           }
       }

       #endregion

       #region 存储过程操作

       /// <summary>
       /// 执行存储过程 ( 注意：使用后一定要对SqlDataReader进行Close )
       /// </summary>
       /// <param name="storedProcName">存储过程名</param>
       /// <param name="parameters">存储过程参数</param>
       /// <returns>SqlDataReader</returns>
       public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               SqlDataReader returnReader;
               connection.Open();
               SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
               command.CommandType = CommandType.StoredProcedure;
               returnReader = command.ExecuteReader();
               return returnReader;
           }
       }


       /// <summary>
       /// 执行存储过程
       /// </summary>
       /// <param name="storedProcName">存储过程名</param>
       /// <param name="parameters">存储过程参数</param>
       /// <param name="tableName">DataSet结果中的表名</param>
       /// <returns>DataSet</returns>
       public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               DataSet dataSet = new DataSet();
               connection.Open();
               SqlDataAdapter sqlDA = new SqlDataAdapter();
               sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
               sqlDA.Fill(dataSet, tableName);
               connection.Close();
               return dataSet;
           }
       }
       public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               DataSet dataSet = new DataSet();
               connection.Open();
               SqlDataAdapter sqlDA = new SqlDataAdapter();
               sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
               sqlDA.SelectCommand.CommandTimeout = Times;
               sqlDA.Fill(dataSet, tableName);
               connection.Close();
               return dataSet;
           }
       }


       /// <summary>
       /// 构建 SqlCommand 对象(用来返回一个结果集，而不是一个整数值)
       /// </summary>
       /// <param name="connection">数据库连接</param>
       /// <param name="storedProcName">存储过程名</param>
       /// <param name="parameters">存储过程参数</param>
       /// <returns>SqlCommand</returns>
       private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
       {
           SqlCommand command = new SqlCommand(storedProcName, connection);
           command.CommandType = CommandType.StoredProcedure;
           foreach (SqlParameter parameter in parameters)
           {
               if (parameter != null)
               {
                   // 检查未分配值的输出参数,将其分配以DBNull.Value.
                   if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                       (parameter.Value == null))
                   {
                       parameter.Value = DBNull.Value;
                   }
                   command.Parameters.Add(parameter);
               }
           }

           return command;
       }

       /// <summary>
       /// 执行存储过程，返回影响的行数		
       /// </summary>
       /// <param name="storedProcName">存储过程名</param>
       /// <param name="parameters">存储过程参数</param>
       /// <param name="rowsAffected">影响的行数</param>
       /// <returns></returns>
       public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
       {
           using (SqlConnection connection = new SqlConnection(strConn))
           {
               int result;
               connection.Open();
               SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
               rowsAffected = command.ExecuteNonQuery();
               result = (int)command.Parameters["ReturnValue"].Value;
               //Connection.Close();
               return result;
           }
       }

       /// <summary>
       /// 创建 SqlCommand 对象实例(用来返回一个整数值)	
       /// </summary>
       /// <param name="storedProcName">存储过程名</param>
       /// <param name="parameters">存储过程参数</param>
       /// <returns>SqlCommand 对象实例</returns>
       private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
       {
           SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
           command.Parameters.Add(new SqlParameter("ReturnValue",
               SqlDbType.Int, 4, ParameterDirection.ReturnValue,
               false, 0, 0, string.Empty, DataRowVersion.Default, null));
           return command;
       }
       #endregion	
    }
}
